#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>

#include "lcdjpg.h" //jpg的头文件

// 自定义的头文件
#include "head.h" //bmp和color的头文件
#include "ts.h"   //触摸屏的头文件
// #include "dclink.h" //双向循环链表的头文件
#include "pic_auto.h" //自动播放的功能
#include "pic_hand.h" //手动播放的功能

// 硬件的初始化
int *init_lcd()
{
    // 打开lcd文件
    int fd_lcd = open("/dev/fb0", O_RDWR);
    if (fd_lcd < 0)
    {
        printf("open file fail\n");
        return NULL;
    }

    // LCD的映射
    int *addr = mmap(NULL,                   // If addr is NULL, then the kernel chooses the  address
                     800 * 480 * 4,          // LCD的大小
                     PROT_READ | PROT_WRITE, // LCD的权限
                     MAP_SHARED,             // LCD的标志量
                     fd_lcd,                 // LCD的文件描述符
                     0);                     // LCD的偏移量
    if (addr == NULL)
    {
        printf("mmap fail\n");
        return NULL;
    }

    return addr;
}

int main(int argc, char **argv)
{

    /*
        硬件的初始化
    */
    int *addr = init_lcd();

#if 0
    /*
        链表的初始化
    */
    struct dclink *head = init_head();
#endif

    /*
        开机logo(开机的效果自定义)
    */
    show_bmp(addr, "logo.bmp");
    sleep(5);

    /*
        主功能
    */
    int x = 0;
    int y = 0;
    while (1)
    {
        // 功能界面
        lcd_draw_jpg(0, 0, "./function.jpg", NULL, 0, 0);

        get_ts_xy(&x, &y);
        if (x > 1 && x < 2 && y > 1 && y < 2)
            auto_play(); // 自动播放auto_play(head) 添加链表

        if (x > 1 && x < 2 && y > 1 && y < 2)
            hand_play(); // 手动播放
    }

        // LCD映射的释放
    munmap(addr, 800 * 480 * 4);

    // 关闭文件
    // close(fd_lcd);

    return 0;
}